#include "head_s.h"

int upload(const user_t* status, const portocol_t* portocol, int net_fd)
{

    // 拼接目录路径
    char path_s[1024] = {0};
    sprintf(path_s, "%s%s%s/%s", status->base_path, status->user_name, status->path, status->arg);
    printf("***************status->arg : %s\n", status->arg);
    printf("***************pash_s: %s\n", path_s);
    // 读取文件大小
    off_t file_size = 0;
    int ret_len = recv(net_fd, &file_size, sizeof(off_t), 0);
    if(ret_len == -1){
        perror("recv filename_len failed!\n");
        exit(1);
    }

    printf("file_size: %ld \n", file_size);
    // TODO 1:这个文件已经存在， 大小形同
    //         -》 告诉客户端， 不用传了
    // TODO 2: 这个文件存在， 比这个大小小
    //      -》 断点续传
    // TODO 3， 这个文件不存在
    //       -》 传全新文件

    printf("path: %s \n", path_s);
    int file_fd = open(path_s, O_RDWR);

    int n = 0;

    int flag = -1;// 0全新上传，  1： 文件已经存在  2 断点续传
    if(file_fd == -1){
        // 说明文件不存在， 全新上传逻辑
        printf("全新的上传逻辑 \n");
        flag = 0;
    }else{
        struct stat file_st;
        fstat(file_fd, &file_st);
        n = file_st.st_size;
        if(file_size == file_st.st_size){
            printf("文件已经存在 \n");
            flag = 1;
        }else{
            printf("断点续传 \n");
            flag = 2;
        }

        close(file_fd);
    }

    send(net_fd, &flag, sizeof(int), MSG_NOSIGNAL);


    if(flag == 1){
        // 文件已经存在 -=》 结束
        return 0;
    }

    // TODO: ------------------------------

    // 打开文件
    if(flag == 0){
        // 全新上传
        int file_fd2 = open(path_s, O_RDWR|O_CREAT, 0600);

        ftruncate(file_fd2, file_size);
        void* mapped = mmap(NULL, file_size, PROT_WRITE, MAP_SHARED, file_fd2, 0);
        recv(net_fd, mapped, file_size, MSG_WAITALL);
        munmap(mapped, file_size );
        close(file_fd2);


    }else{
        int file_fd2 = open(path_s, O_RDWR);
        // 断点上传
        off_t upload_size = n;
        send(net_fd, &upload_size, sizeof(off_t), MSG_NOSIGNAL);
        ftruncate(file_fd2, file_size);
        void* mapped = mmap(NULL, file_size, PROT_WRITE, MAP_SHARED, file_fd2,0);

        int ret = recv(net_fd, mapped+upload_size, file_size - upload_size, MSG_WAITALL);
        printf("recv ret: %d \n", ret);
        munmap(mapped, file_size);
        close(file_fd2);
    }


    return 0;
}
